package com.haolp.sys.common.web;

import com.haolp.sys.common.vo.JsonResultVO;
import org.apache.shiro.ShiroException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author 小李
 * @version 1.0
 * @date 2021/10/6 16:11
 * 对控制层可能出现的异常，进行统一异常处理
 * @ControllerAdvice注解描述的类为SpringMVC中的一个全局异常处理类
 * 此类中可以定义多个全局异常处理方法
 * 这些方法需要使用@ExceptionHandler注解进行修饰
 * @ExceptionHandler中定义的异常类型为此方法可以处理的异常类型
 * 并且可以处理这个异常子类类型的异常
 */
@ControllerAdvice
public class GlobalException {
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public JsonResultVO doHandlerRuntimeException(
            RuntimeException e){
        e.printStackTrace();
        return new JsonResultVO(e);

    }
    @ExceptionHandler(ShiroException.class)
    @ResponseBody
    public JsonResultVO doHandlerShiroException(
            RuntimeException e){
       // e.printStackTrace();
        JsonResultVO jrv=new JsonResultVO();
        jrv.setState(0);
        if (e instanceof UnknownAccountException){
           jrv.setMessage("账户不存在");
        }else if(e instanceof LockedAccountException){
            jrv.setMessage("账户已被禁用");
        }else if (e instanceof AuthorizationException){
            jrv.setMessage("没有此操作权限");
        }else {
            jrv.setMessage("系统维护中");
        }
        e.printStackTrace();
        return jrv;//封装异常信息

    }

}
